/**
  * @file		pid_algorithm.h
  * @brief		pid控制算法头文件。
  * 	
  * @note		
  *	
  * @author 	FFerryman
  * @date		2025-7-20
  * @version 	1.0
  */
#ifndef __PID_ALGORITHM_H
#define __PID_ALGORITHM_H

#ifdef __cplusplus
extern "C" {
#endif
#include "zf_common_headfile.h"

/**
 * @brief PID控制参数结构体
 *
 * 该结构体用于存储PID控制相关的参数，包括比例、积分、微分系数，
 * 积分和输出限幅值，以及用于计算的中间变量。
 */
typedef struct {
    float p;                    ///< 比例系数
    float i;                    ///< 积分系数
    float d;                    ///< 微分系数
    float i_value;              ///< 积分项
    float i_value_pro;          ///< 积分系数
    float i_value_max;          ///< 积分项最大值（限幅）
    int16_t out;                  ///< PID输出
    int16_t out_max;              ///< PID输出最大值（限幅）
    float p_value_last;         ///< 上一次的比例项值
    float incremental_data[2];  ///< 增量式 PID 数据存储数组，用于保存前两次的增量数据
} pid_cycle_struct;
/**
 * @brief 	双边限幅 数据范围是 [-32768,32767]
 * @param	x	被限幅的数据
 * @param	a	限幅范围左边界
 * @param	b	限幅范围右边界
 * @return	int	限幅之后的数据
 * @note	
 * @example	int dat = func_limit_ab(500, -300, 400);//数据被限制在-300至+400之间  因此返回的结果是400
 */
#define     func_limit_ab(x, a, b)  ((x) < (a) ? (a) : ((x) > (b) ? (b) : (x)))

//位置式PID
void pid_control(pid_cycle_struct* pid_cycle, float target, float real);
//增量式PID
void pid_control_incremental(pid_cycle_struct* pid_cycle, float target, float real);

#ifdef __cplusplus
}
#endif

#endif
